package org.example.lotterysystem.Test;

import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class RabbitmqConsumer {
    public static void main(String[] args) throws Exception {
// 1. 创建连接⼯⼚
        ConnectionFactory factory = new ConnectionFactory();
        //2. 设置参数
        factory.setHost("127.0.0.1");//ip 默认值localhost
        factory.setPort(5672); //默认值5672
        factory.setVirtualHost("Quenue");//虚拟机名称, 默认 /
        factory.setUsername("guest");//⽤⼾名,默认guest
        factory.setPassword("guest");//密码, 默认guest
        //3. 创建连接Connection
        Connection connection = factory.newConnection();
        //4. 创建channel通道
        Channel channel = connection.createChannel();
        //5. 声明队列
 /*
 queueDeclare(String queue, boolean durable, boolean exclusive,
boolean autoDelete, Map<String, Object> arguments)
 1.queue: 队列名称
 2.durable: 是否持久化, 当mq重启之后, 消息还在
 3.exclusive:
 * 是否独占, 只能有⼀个消费者监听队列
 * 当Connection关闭时, 是否删除队列
 4.autoDelete: 是否⾃动删除, 当没有Consumer时, ⾃动删除掉
 5.arguments: ⼀些参数
 */
        //如果没有⼀个hello 这样的⼀个队列, 会⾃动创建, 如果有, 则不创建
        channel.queueDeclare("hello", true, false, false, null);
        //6. 接收消息, 并消费
 /*
 basicConsume(String queue, boolean autoAck, Consumer callback)
 参数:
 1. queue: 队列名称
 2. autoAck: 是否⾃动确认, 消费者收到消息之后,⾃动和MQ确认
 3. callback: 回调对象
 */
        DefaultConsumer consumer = new DefaultConsumer(channel) {
            /*
            回调⽅法, 当收到消息后, 会⾃动执⾏该⽅法
            1. consumerTag: 标识
            2. envelope: 获取⼀些信息, 交换机, 路由key
            3. properties:配置信息
            4. body:数据
            */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("接收到消息: " + new String(body));
            }
        };
        channel.basicConsume("hello", true, consumer);
        //等待回调函数执⾏完毕之后, 关闭资源
        TimeUnit.SECONDS.sleep(5);
        //7. 释放资源 消费者相当于是⼀个监听程序, 不需要关闭资源
        //顺序不可改变
// channel.close();
// connection.close();
    }
}

